﻿using System;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("=== 演示Thread和Task的基本用法 ===");
        DemonstrateThreadAndTask();

        Console.WriteLine("\n=== 演示异步死锁场景 ===");
        try
        {
            // 这个调用会导致死锁
            DeadlockExample();
        }
        catch (Exception ex)
        {
            Console.WriteLine($"捕获到异常: {ex.Message}");
        }

        Console.WriteLine("\n=== 演示避免死锁的正确做法 ===");
        DeadlockSolution();

        Console.WriteLine("\n=== 演示ConfigureAwait的用法 ===");
        ConfigureAwaitExample();
    }

    // 演示Thread和Task的基本用法和区别
    static void DemonstrateThreadAndTask()
    {
        // 使用Thread
        var thread = new Thread(ThreadWork);
        thread.Name = "WorkerThread";
        Console.WriteLine("启动Thread...");
        thread.Start(5);

        // 使用Task
        Console.WriteLine("启动Task...");
        var task = Task.Run(() => TaskWork(5));

        // 等待完成
        thread.Join();
        task.Wait();

        Console.WriteLine("所有操作完成");
    }

    static void ThreadWork(object count)
    {
        int iterations = (int)count;
        for (int i = 0; i < iterations; i++)
        {
            Console.WriteLine($"Thread {Thread.CurrentThread.Name} 执行: {i}");
            Thread.Sleep(100); // 模拟工作
        }
    }

    static void TaskWork(int count)
    {
        for (int i = 0; i < count; i++)
        {
            Console.WriteLine($"Task 在线程 {Thread.CurrentThread.ManagedThreadId} 执行: {i}");
            Task.Delay(100).Wait(); // 模拟异步工作
        }
    }

    // 演示异步死锁场景
    static void DeadlockExample()
    {
        // 注意: 这个方法会导致死锁
        Console.WriteLine("进入DeadlockExample");

        // 在这里我们混合使用了async方法和.Wait()
        var task = AsyncMethod();
        task.Wait(); // 这会导致死锁

        Console.WriteLine("DeadlockExample完成 (不会执行到这里)");
    }

    // 演示避免死锁的正确做法
    static async void DeadlockSolution()
    {
        Console.WriteLine("进入DeadlockSolution");

        // 正确做法: 全程使用async/await
        await AsyncMethod();

        Console.WriteLine("DeadlockSolution完成");
    }

    // 演示ConfigureAwait的用法
    static async void ConfigureAwaitExample()
    {
        Console.WriteLine($"ConfigureAwaitExample 开始于线程 {Thread.CurrentThread.ManagedThreadId}");

        // 使用ConfigureAwait(false)避免上下文切换
        await AsyncMethod().ConfigureAwait(false);

        Console.WriteLine($"ConfigureAwaitExample 结束于线程 {Thread.CurrentThread.ManagedThreadId}");
    }

    static async Task AsyncMethod()
    {
        Console.WriteLine($"AsyncMethod 开始于线程 {Thread.CurrentThread.ManagedThreadId}");

        // 模拟异步操作
        await Task.Delay(1000);

        Console.WriteLine($"AsyncMethod 继续于线程 {Thread.CurrentThread.ManagedThreadId}");

        // 模拟更多工作
        await Task.Delay(500);
    }
}
